/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package byblos.apresentacao.email;

import byblos.apresentacao.configuracao.MensagemEmail;
import byblos.apresentacao.idioma.InterceptadorIdioma;
import byblos.apresentacao.usuario.InterceptadorCategoriaUsuario;
import byblos.negocio.Idioma;
import byblos.negocio.cliente.Cliente;
import byblos.negocio.configuracao.ConfiguracaoEmailUtil;
import byblos.negocio.maladireta.MalaDireta;
import byblos.persistencia.DAO;
import byblos.util.MultipartRequestInterceptor;
import byblos.util.StringUtil;
import byblos.util.Util;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;
import org.vraptor.annotations.Component;
import org.vraptor.annotations.In;
import org.vraptor.annotations.InterceptedBy;
import org.vraptor.annotations.Logic;
import org.vraptor.annotations.Out;
import org.vraptor.annotations.Parameter;
import org.vraptor.interceptor.UploadedFileInformation;

/**
 *
 * @author Diego
 */
@Component
@InterceptedBy(value = {InterceptadorIdioma.class, InterceptadorCategoriaUsuario.class, MultipartRequestInterceptor.class})
public class MalaDiretaComponent {

    private List<Cliente> clientes;
    @Out
    private List<Cliente> clientesPortugues;
    @Out
    private List<Cliente> clientesAlemao;
    @Out
    private List<Cliente> clientesFrances;
    @Out
    private List<Cliente> clientesIngles;
    @Out
    private List<Cliente> clientesEspanhol;
    @Parameter
    private String cco;
    @Out
    @Parameter
    private String assunto;
    @Out
    @Parameter
    private String mensagem;
    @In
    private HttpServletRequest request;
    @Out
    private List<MalaDireta> mensagens;
    @Out
    @Parameter(create = true)
    private MalaDireta malaDireta;
    @Parameter
    private int idMsg;
    @In(required = false)
    private UploadedFileInformation foto;
    @Out
    private String mensagemSucesso;
    @Out
    private String mensagemErro;

    public void listar() {
        mensagens = new DAO().listar(MalaDireta.class);
    }

    @Logic(parameters = {"id"})
    public void editar(int id) {
        if (id == 0) {
            malaDireta = new MalaDireta();
        } else {
            malaDireta = new DAO().localizar(MalaDireta.class, id);
//            mensagem = malaDireta.getMensagem();
//            assunto = malaDireta.getAssunto();
        }
    }

    public void selecionar() {
        salvar();
        malaDireta = new DAO().localizar(MalaDireta.class, idMsg);
        clientesPortugues = new DAO().listar(Cliente.class, "ClientePorIdioma", Idioma.PORTUGUES);
        clientesAlemao = new DAO().listar(Cliente.class, "ClientePorIdioma", Idioma.ALEMAO);
        clientesFrances = new DAO().listar(Cliente.class, "ClientePorIdioma", Idioma.FRANCES);
        clientesIngles = new DAO().listar(Cliente.class, "ClientePorIdioma", Idioma.INGLES);
        clientesEspanhol = new DAO().listar(Cliente.class, "ClientePorIdioma", Idioma.ESPANHOL);
    }

    public String salvar() {
        if (idMsg == 0) {
            malaDireta = new MalaDireta();
        } else {
            malaDireta = new DAO().localizar(MalaDireta.class, idMsg);
        }
        boolean adicionouImagem = false;
        boolean fotoAcima2Mb = false;
        if (foto != null) {
            if (foto.getFile().length() > 2097152) {
                fotoAcima2Mb = true;
            } else {
                String caminhoRelativoFoto = Util.salvarArquivo(request, "galeria", foto, false, null);
                malaDireta.setImagem(caminhoRelativoFoto);
                adicionouImagem = true;
            }
        }

        malaDireta.setAssunto(assunto == null ? "" : assunto);
        mensagem = StringUtil.formatarTextoFckEditor(mensagem);
        malaDireta.setMensagem(mensagem);
        new DAO().salvar(malaDireta);
        if (fotoAcima2Mb) {
            request.getParameterMap().put("id", "" + malaDireta.getId());
            mensagemErro = "Arquivo superior a 2Mb. Favor escolha outro arquivo!";
            return "editar";
        }
        if (adicionouImagem) {
            request.getParameterMap().put("id", "" + malaDireta.getId());
            mensagemSucesso = "Foto salva com sucesso!";
            return "editar";
        } else {
            mensagemSucesso = "Mensagem salva com sucesso!";
            return "ok";
        }
    }

    public void remover(int id) {
        MalaDireta msg = new DAO().localizar(MalaDireta.class, id);
        new DAO().remover(msg);
    }

    public String enviar() {
        try {
            malaDireta = new DAO().localizar(MalaDireta.class, idMsg);
            Map parametros = request.getParameterMap();
            Set chaves = parametros.keySet();
            clientes = new ArrayList<Cliente>();
            for (Object chave : chaves) {
                String nomeParametro = chave.toString();
                if (nomeParametro.startsWith("cliente-")) {
                    int id = Integer.parseInt(nomeParametro.split("-")[1]);
                    Cliente cliente = new DAO().localizar(Cliente.class, id);
                    clientes.add(cliente);
                }
            }
            String html = "<table border=\"0\" style=\"width:780px; border-spacing:0; border-collapse:collapse; font-style:normal; font-variant:normal; font-family: Arial;\" align=\"center\"><tr><td><a href=\"http://www.byblospousada.com.br/byblos\" target=\"_blank\"><div style=\"margin-left:30px;\"><img src=\"http://www.byblospousada.com.br/byblos/site/imagens/logo.jpg\"  width=\"206px\" height=\"82px\" style=\"border:0;\"/></div></a></td></tr>" +
                    "<tr><td background=\"http://www.byblospousada.com.br/byblos/site/imagens/shadowImpressao.gif\"><div style=\"text-align:center;\"><img style=\"margin:0; padding:8px 0 10px 0; border:0;\" src=\"http://www.byblospousada.com.br" + malaDireta.getImagem() + "\" width=\"677\" height=\"271\" /></div></td></tr>" +
                    "<tr><td style=\"margin:0; vertical-align:top; padding: 30px 100px 0 100px;\"><h1 style=\"margin:0 0 5px 0; padding:0; color: #757575; font-size:30px; font-weight:bold;\">" + malaDireta.getAssunto() + "</h1><img src=\"http://www.byblospousada.com.br/byblos/site/imagens/line_title.gif\" /></td></tr>" +
                    "<tr><td style=\"margin:0; vertical-align:top; padding: 15px 100px 20px 100px;\"><p style=\"text-align:justify; line-height:20px; font-size:14px;\">" + malaDireta.getMensagem() + "</p></td></tr>" +
                    "<tr><td align=\"center\"><div style=\"color: #757575; font-size:12px; border-top:1px #757575 solid; width:580px; padding: 15px 0 30px 0; margin:0; text-align:center;\"><p>Rua Alto do Humaitá, 14 - Centro - Búzios - Rio de Janeiro<br />Telefone: +55 22 2623-1162  |  Fax: +55 22 2623-2828<br />" +
                    "<a style=\"color:#757575;\" href=\"http://www.byblospousada.com.br/byblos\">www.byblospousada.com.br</a></p>" +
                    "<p style=\"font-size:10px;\">*caso não queira mais receber essa mensagem, mande-nos um e-mail para <a style=\"color:#757575;\" href=\"mailto:email@byblos.com.br\">email@byblos.com.br</a></p></div></td></tr></table>";

            assunto = malaDireta.getAssunto();
            mensagem = html;
            String retorno = montarEmail();
            return retorno;
        } catch (MessagingException ex) {
            Logger.getLogger(EmailComponent.class.getName()).log(Level.SEVERE, null, ex);
            mensagemErro = "Não foi possível enviar a mensagem!";
            return "invalid";
        }
    }

    private String montarEmail() throws MessagingException {
        if (new ConfiguracaoEmailUtil().getConfig() == null) {
            mensagemErro = "Não há nenhuma configuração de email! Cadastre no menu Newsletter";
            return "noConfig";
        }
        MensagemEmail mensagem = new MensagemEmail(assunto, this.mensagem);
        mensagem.addCopiasOcultas(construirListaEmails());
        mensagem.enviar();
        mensagemSucesso = "Mensagem enviada com sucesso!";
        return "ok";
    }

    private List<String> construirListaEmails() {
        List<String> emails = new LinkedList<String>();
        for (Cliente cliente : clientes) {
            emails.add(cliente.getEmail());
        }

        if (!cco.equals("")) {
            cco = cco.trim();
            cco = cco.replaceAll(",", ";");
            String[] listaCco = cco.split(";");
            for (String email : listaCco) {
                emails.add(email);
            }
        }

        return emails;
    }
}
